Am Sonntag, den 12.08.2012, 20:57 +0900 schrieb Takahisa Tanaka:
> The current sp5100_tco driver only supports SP5100/SB7x0 chipset, doesn't
> support SB8x0 chipset, because current sp5100_tco driver doesn't know that the
> offset address for watchdog timer was changed from SB8x0 chipset.
> 
> The offset address of SP5100 and SB7x0 chipsets are as follows, quote from the
> AMD SB700/710/750 Register Reference Guide(Page 164) and the AMD SP5100
> Register Reference Guide(Page 166).
> 
>   WatchDogTimerControl 69h
>   WatchDogTimerBase0   6Ch
>   WatchDogTimerBase1   6Dh
>   WatchDogTimerBase2   6Eh
>   WatchDogTimerBase3   6Fh
> 
> In contrast, the offset address of SB8x0 chipset is as follows, quote from
> AMD SB800-Series Southbridges Register Reference Guide(Page 147).
> 
>   WatchDogTimerEn      48h
>   WatchDogTimerConfig  4Ch
> 
> So, In the case of SB8x0 chipset, sp5100_tco reads meaningless MMIO
> address(for example, 0xbafe00) from wrong offset address, and the following
> message is logged.
> 
>    SP5100 TCO timer: mmio address 0xbafe00 already in use
> 
> With this patch, sp5100_tco driver supports SB8x0 chipset, and can avoid
> iomem resource conflict. The processing of this patch is as follows.
> 
>  Step 1) Attempt to get the watchdog base address from indirect I/O(0xCD6
>          and 0xCD7).
>   - Go to the step 7 if obtained address hasn't conflicted with other
>     resource. But, currently, the address(0xfec000f0) conflicts with the
>     IOAPIC MMIO address, and the following message is logged.
> 
>        SP5100 TCO timer: mmio address 0xfec000f0 already in use
> 
>     0xfec000f0 is recommended by AMD BIOS Developer's Guide. So, go to the
>     next step.
> 
>  Step 2) Attempt to get the SBResource_MMIO base address from AcpiMmioEN(for
>          SB8x0,  PM_Reg:24h) or SBResource_MMIO(SP5100/SB7x0, PCI_Reg:9Ch)
>          register.
>   - Go to the step 7 if these register has enabled by BIOS, and obtained
>     address hasn't conflicted with other resource.
>   - If above condition isn't true, go to the next step.
> 
>  Step 3) Attempt to get the free MMIO address from allocate_resource().
>   - Go to the step 7 if these register has enabled by BIOS, and obtained
>     address hasn't conflicted with other resource.
>   - Driver initialization has failed if obtained address has conflicted
>     with other resource, and no 'force_addr' parameter is specified.
> 
>  Step 4) Use the specified address If 'force_addr' parameter is specified.
>   - allocate_resource() function may fail, when the PCI bridge device occupies
>     iomem resource from 0xf0000000 to 0xffffffff. To handle such a case,
>     I added 'force_addr' parameter to sp5100_tco driver. With 'force_addr'
>     parameter, sp5100_tco driver directly can assign MMIO address for watchdog
>     timer from free iomem region. Note that It's dangerous to specify wrong
>     address in the 'force_addr' parameter.
> 
>       Example of force_addr parameter use
>         # cat /proc/iomem
>         ...snip...
>         fec00000-fec003ff : IOAPIC 0
>                                       <--- free MMIO region
>         fec10000-fec1001f : pnp 00:0b
>         fec20000-fec203ff : IOAPIC 1
>         ...snip...
>         # cat /etc/modprobe.d/sp5100_tco.conf
>         options sp5100_tco force_addr=0xfec00800
>         # modprobe sp5100_tco
>         # cat /proc/iomem
>         ...snip...
>         fec00000-fec003ff : IOAPIC 0
>         fec00800-fec00807 : SP5100 TCO  <--- watchdog timer MMIO address
>         fec10000-fec1001f : pnp 00:0b
>         fec20000-fec203ff : IOAPIC 1
>         ...snip...
>         #
> 
>   - Driver initialization has failed if specified address has conflicted
>     with other resource.
> 
>  Step 5) Disable the watchdog timer
>   - To rewrite the watchdog timer register of the chipset, absolutely
>     guarantee that the watchdog timer is disabled.
> 
>  Step 6) Re-program the watchdog timer MMIO address to chipset.
>   - Re-program the obtained MMIO address in Step 3 or Step 4 to chipset via
>     indirect I/O(0xCD6 and 0xCD7).
> 
>  Step 7) Enable and setup the watchdog timer
> 
> This patch has worked fine on my test environment(ASUS M4A89GTD-PRO/USB3 and
> DL165G7). therefore I believe that it's no problem to re-program the MMIO
> address for watchdog timer to chipset during disabled watchdog. However,
> I'm not sure about it, because I don't know much about chipset programming.
> 
> So, any comments will be welcome.
> 
> Tested-by: Paul Menzel <paulepan...@users.sourceforge.net>

ASRock A780FullHD <http://www.asrock.com/mb/overview.asp?model=a780fullhd>

> CC: sta...@kernel.org

I am sorry. This should have been <sta...@vger.kernel.org>.

> Signed-off-by: Takahisa Tanaka <mc74h...@gmail.com>

After review from the maintainers, please also add

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=43176

when sending `PATCH v2` (`--subject-prefix` [1]).

[1] 
http://wireless.kernel.org/en/developers/Documentation/git-guide#Annotating_new_revision

> ---
>  drivers/watchdog/sp5100_tco.c | 291 
> ++++++++++++++++++++++++++++++++++++------
>  drivers/watchdog/sp5100_tco.h |  46 +++++--
>  2 files changed, 286 insertions(+), 51 deletions(-)
> 
> diff --git a/drivers/watchdog/sp5100_tco.c b/drivers/watchdog/sp5100_tco.c
> index ae5e82c..36e917f 100644
> --- a/drivers/watchdog/sp5100_tco.c
> +++ b/drivers/watchdog/sp5100_tco.c
> @@ -13,7 +13,9 @@
>   *   as published by the Free Software Foundation; either version
>   *   2 of the License, or (at your option) any later version.
>   *
> - *   See AMD Publication 43009 "AMD SB700/710/750 Register Reference Guide"
> + *   See AMD Publication 43009 "AMD SB700/710/750 Register Reference Guide",
> + *       AMD Publication 45482 "AMD SB800-Series Sourthbridges Register

Sou*thbridges

> + *                                                         Reference Guide"
>   */
>  
>  /*
> @@ -38,18 +40,23 @@
>  #include "sp5100_tco.h"
>  
>  /* Module and version information */
> -#define TCO_VERSION "0.01"
> +#define TCO_VERSION "0.03"
>  #define TCO_MODULE_NAME "SP5100 TCO timer"
>  #define TCO_DRIVER_NAME   TCO_MODULE_NAME ", v" TCO_VERSION
>  
>  /* internal variables */
>  static u32 tcobase_phys;
> +static u32 resbase_phys;
>  static void __iomem *tcobase;
>  static unsigned int pm_iobase;
>  static DEFINE_SPINLOCK(tco_lock);    /* Guards the hardware */
>  static unsigned long timer_alive;
>  static char tco_expect_close;
>  static struct pci_dev *sp5100_tco_pci;
> +static struct resource wdt_res = {
> +     .name = "Watchdog Timer",
> +     .flags = IORESOURCE_MEM,
> +};
>  
>  /* the watchdog platform device */
>  static struct platform_device *sp5100_tco_platform_device;
> @@ -67,6 +74,12 @@ module_param(nowayout, bool, 0);
>  MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started"
>               " (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
>  
> +static unsigned int force_addr;
> +module_param(force_addr, uint, 0);
> +MODULE_PARM_DESC(force_addr, "Force the use of specified MMIO address, "
> +             "default is disabled. DON'T USE THIS PARAMETER ONLY "
> +             "IF YOU REALLY KNOW WHAT YOU ARE DOING");

ONLY USE THIS PARAMETER IF YOU REALLY KNOW WHAT YOU ARE DOING!

[…]


Thanks,

Paul

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to