On Fri, Nov 02, 2007 at 02:03:18AM -0400, Corey Osgood wrote:
> @@ -79,11 +62,14 @@
>  
>       loops = 0;
>       /* Yes, this is a mess, but it's the easiest way to do it. */
> -     while ((inb(SMBHSTSTAT) & 1) == 1 && loops <= SMBUS_TIMEOUT)
> +     while ((inb(SMBHSTSTAT) & 1) == 1 && loops < SMBUS_TIMEOUT)

Rationale? Does it make a big difference?


> -u8 smbus_read_byte(u32 dimm, u32 offset)
> +/**
> + * Read a byte from the smbus
> + *
> + * @param dimm The address location of the dimm on the smbus
> + * @param offset The offset the data is located at
> + */

> +u8 smbus_read_byte(u8 dimm, u8 offset)

I'm still not entirely sure they're always only 8 bit. Do you have a
pointer to a datasheet or spec or standard where it's explicitly
defined as 8 bit? Yes, it _is_ 8 bits in most cases, but can we be sure
that it'll be 8 bit in _all_ of them? On all chipsets and controllers?


> -     /* Can I just "return inb(SMBHSTDAT0)"? */
> +     /* We could probably return inb(SMBHSTDAT0), but we'd lose the ability
> +      * to debug the transaction */

OK, if that's the only issue, just drop the comment.


> +/**
> + * This is provided for compatibility, should it be needed
> + */
> +inline u8 spd_read_byte(u32 address, u8 offset)
> +{
> +     return smbus_read_byte(address, offset);
> +}

Hm, this is usually done in auto.c per-mainboard, I think. Either
you make spd_read_byte() a wrapper for smbus_read_byte(), or you
use the "fake spd" method to return hard-coded settings if there's
no real SPD data to be read.

Not sure this function makes sense in vt8237r_early_smbus.c, because of
the above and also because it's not SMBus-related per se. I'd say drop it.

Also, address is 32bit here but 8bit in smbus_read_byte()?


> +/**
> + * A fixup for some systems that need time for the smbus to "warm up"
> + * It reads the ID byte from SMBus, looking for good data from a slot/address
> + * Exits on either good data or a timeout

Yep, but please extend the comment a bit to contain more information,
rationale, example use case where this issue came up, how the problem
shows, how it's fixed etc. The comment is good, but a bit too short
for describing this non-trivial issue at hand.


> + *
> + * @param mem_controller The memory controller and smbus addresses
> + */
> +void smbus_fixup(const struct mem_controller *ctrl)
> +{
> +     int i, ram_slots, current_slot = 0;
> +     u8 result = 0;
> +
> +#ifdef DIMM_SOCKETS
> +     ram_slots = DIMM_SOCKETS;
> +#else
> +     ram_slots = sizeof(ctrl->channel0)/sizeof(ctrl->channel0[0]);
> +#endif

Can you explain? Shouldn't DIMM_SOCKETS always match
sizeof(ctrl->channel0)/sizeof(ctrl->channel0[0])? When does it happen
that they do not match (and why?).

Also, we now have ARRAY_SIZE(), please use it here.


> +     if (!ram_slots) {
> +             print_err("smbus_fixup thinks there are no ram slots!\r\n");
> +             return;
> +     }
> +     
> +     PRINT_DEBUG("Waiting for smbus to warm up");
> +             
> +     /* Bad SPD data should be either 0 or 0xff, so really the values we look
> +      * for are arbitrary, as long as they're between 1 and 0xfe */
> +     for(i = 0; (i < SMBUS_TIMEOUT && ((result < SPD_MEMORY_TYPE_SDRAM) || 
> +                     (result > SPD_MEMORY_TYPE_SDRAM_DDR2))); i++)

Please explain the SPD_MEMORY_TYPE_SDRAM/SPD_MEMORY_TYPE_SDRAM_DDR2
check in the comment here.

If all you want is to know whether some sensible RAM type is
returned wouldn't "> 0" and "< 0xff" be enough (as per your comment)?
You don't really care about the exact type, you only want to know _if_ there's
a DIMM here, correct?

If I read this correctly you're checking whether you get one of these?

#define SPD_MEMORY_TYPE_SDRAM            4
#define SPD_MEMORY_TYPE_MULTIPLEXED_ROM  5
#define SPD_MEMORY_TYPE_SGRAM_DDR        6
#define SPD_MEMORY_TYPE_SDRAM_DDR        7
#define SPD_MEMORY_TYPE_SDRAM_DDR2       8

If we make this "> 0" and "< 0xff" ("< 10" or so should be enough, too)
then this function might be usable on non-vt8237r chipsets and can go
in some global SMBus file to be used by others?


> +     {
> +             if (current_slot > ram_slots) j = 0;
> +             result = spd_read_byte(ctrl->channel0[current_slot], 
> +                                                     SPD_MEMORY_TYPE);
> +             current_slot++;
> +             PRINT_DEBUG(".");
> +     }
> +     if (i >= SMBUS_TIMEOUT) print_err("SMBus timed out while warming 
> up\r\n");
> +     else PRINT_DEBUG("Done\r\n");   
> +}


Looks good otherwise. Does this contain all of the changes required to
make it work on your board _and_ Rudolf's board?


Thanks, Uwe.
-- 
http://www.hermann-uwe.de  | http://www.holsham-traders.de
http://www.crazy-hacks.org | http://www.unmaintained-free-software.org

Attachment: signature.asc
Description: Digital signature

-- 
linuxbios mailing list
linuxbios@linuxbios.org
http://www.linuxbios.org/mailman/listinfo/linuxbios

Reply via email to