ata: move *sata_set_spd*() to libata-sata.c
* move *sata_set_spd*() to libata-sata.c * add static inlines for CONFIG_SATA_HOST=n case Code size savings on m68k arch using (modified) atari_defconfig: text data bss dec hex filename before: 32842 572 40 33458 82ae drivers/ata/libata-core.o after: 32812 572 40 33428 8290 drivers/ata/libata-core.o Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
6eab1bc0ee
commit
ab4117cf24
@ -3050,87 +3050,6 @@ int sata_down_spd_limit(struct ata_link *link, u32 spd_limit)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __sata_set_spd_needed(struct ata_link *link, u32 *scontrol)
|
|
||||||
{
|
|
||||||
struct ata_link *host_link = &link->ap->link;
|
|
||||||
u32 limit, target, spd;
|
|
||||||
|
|
||||||
limit = link->sata_spd_limit;
|
|
||||||
|
|
||||||
/* Don't configure downstream link faster than upstream link.
|
|
||||||
* It doesn't speed up anything and some PMPs choke on such
|
|
||||||
* configuration.
|
|
||||||
*/
|
|
||||||
if (!ata_is_host_link(link) && host_link->sata_spd)
|
|
||||||
limit &= (1 << host_link->sata_spd) - 1;
|
|
||||||
|
|
||||||
if (limit == UINT_MAX)
|
|
||||||
target = 0;
|
|
||||||
else
|
|
||||||
target = fls(limit);
|
|
||||||
|
|
||||||
spd = (*scontrol >> 4) & 0xf;
|
|
||||||
*scontrol = (*scontrol & ~0xf0) | ((target & 0xf) << 4);
|
|
||||||
|
|
||||||
return spd != target;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* sata_set_spd_needed - is SATA spd configuration needed
|
|
||||||
* @link: Link in question
|
|
||||||
*
|
|
||||||
* Test whether the spd limit in SControl matches
|
|
||||||
* @link->sata_spd_limit. This function is used to determine
|
|
||||||
* whether hardreset is necessary to apply SATA spd
|
|
||||||
* configuration.
|
|
||||||
*
|
|
||||||
* LOCKING:
|
|
||||||
* Inherited from caller.
|
|
||||||
*
|
|
||||||
* RETURNS:
|
|
||||||
* 1 if SATA spd configuration is needed, 0 otherwise.
|
|
||||||
*/
|
|
||||||
static int sata_set_spd_needed(struct ata_link *link)
|
|
||||||
{
|
|
||||||
u32 scontrol;
|
|
||||||
|
|
||||||
if (sata_scr_read(link, SCR_CONTROL, &scontrol))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return __sata_set_spd_needed(link, &scontrol);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* sata_set_spd - set SATA spd according to spd limit
|
|
||||||
* @link: Link to set SATA spd for
|
|
||||||
*
|
|
||||||
* Set SATA spd of @link according to sata_spd_limit.
|
|
||||||
*
|
|
||||||
* LOCKING:
|
|
||||||
* Inherited from caller.
|
|
||||||
*
|
|
||||||
* RETURNS:
|
|
||||||
* 0 if spd doesn't need to be changed, 1 if spd has been
|
|
||||||
* changed. Negative errno if SCR registers are inaccessible.
|
|
||||||
*/
|
|
||||||
int sata_set_spd(struct ata_link *link)
|
|
||||||
{
|
|
||||||
u32 scontrol;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol)))
|
|
||||||
return rc;
|
|
||||||
|
|
||||||
if (!__sata_set_spd_needed(link, &scontrol))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if ((rc = sata_scr_write(link, SCR_CONTROL, scontrol)))
|
|
||||||
return rc;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(sata_set_spd);
|
|
||||||
|
|
||||||
#ifdef CONFIG_ATA_ACPI
|
#ifdef CONFIG_ATA_ACPI
|
||||||
/**
|
/**
|
||||||
* ata_timing_cycle2mode - find xfer mode for the specified cycle duration
|
* ata_timing_cycle2mode - find xfer mode for the specified cycle duration
|
||||||
|
@ -271,6 +271,87 @@ int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(sata_link_scr_lpm);
|
EXPORT_SYMBOL_GPL(sata_link_scr_lpm);
|
||||||
|
|
||||||
|
static int __sata_set_spd_needed(struct ata_link *link, u32 *scontrol)
|
||||||
|
{
|
||||||
|
struct ata_link *host_link = &link->ap->link;
|
||||||
|
u32 limit, target, spd;
|
||||||
|
|
||||||
|
limit = link->sata_spd_limit;
|
||||||
|
|
||||||
|
/* Don't configure downstream link faster than upstream link.
|
||||||
|
* It doesn't speed up anything and some PMPs choke on such
|
||||||
|
* configuration.
|
||||||
|
*/
|
||||||
|
if (!ata_is_host_link(link) && host_link->sata_spd)
|
||||||
|
limit &= (1 << host_link->sata_spd) - 1;
|
||||||
|
|
||||||
|
if (limit == UINT_MAX)
|
||||||
|
target = 0;
|
||||||
|
else
|
||||||
|
target = fls(limit);
|
||||||
|
|
||||||
|
spd = (*scontrol >> 4) & 0xf;
|
||||||
|
*scontrol = (*scontrol & ~0xf0) | ((target & 0xf) << 4);
|
||||||
|
|
||||||
|
return spd != target;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sata_set_spd_needed - is SATA spd configuration needed
|
||||||
|
* @link: Link in question
|
||||||
|
*
|
||||||
|
* Test whether the spd limit in SControl matches
|
||||||
|
* @link->sata_spd_limit. This function is used to determine
|
||||||
|
* whether hardreset is necessary to apply SATA spd
|
||||||
|
* configuration.
|
||||||
|
*
|
||||||
|
* LOCKING:
|
||||||
|
* Inherited from caller.
|
||||||
|
*
|
||||||
|
* RETURNS:
|
||||||
|
* 1 if SATA spd configuration is needed, 0 otherwise.
|
||||||
|
*/
|
||||||
|
int sata_set_spd_needed(struct ata_link *link)
|
||||||
|
{
|
||||||
|
u32 scontrol;
|
||||||
|
|
||||||
|
if (sata_scr_read(link, SCR_CONTROL, &scontrol))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return __sata_set_spd_needed(link, &scontrol);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sata_set_spd - set SATA spd according to spd limit
|
||||||
|
* @link: Link to set SATA spd for
|
||||||
|
*
|
||||||
|
* Set SATA spd of @link according to sata_spd_limit.
|
||||||
|
*
|
||||||
|
* LOCKING:
|
||||||
|
* Inherited from caller.
|
||||||
|
*
|
||||||
|
* RETURNS:
|
||||||
|
* 0 if spd doesn't need to be changed, 1 if spd has been
|
||||||
|
* changed. Negative errno if SCR registers are inaccessible.
|
||||||
|
*/
|
||||||
|
int sata_set_spd(struct ata_link *link)
|
||||||
|
{
|
||||||
|
u32 scontrol;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol)))
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
if (!__sata_set_spd_needed(link, &scontrol))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if ((rc = sata_scr_write(link, SCR_CONTROL, scontrol)))
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(sata_set_spd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ata_slave_link_init - initialize slave link
|
* ata_slave_link_init - initialize slave link
|
||||||
* @ap: port to initialize slave link for
|
* @ap: port to initialize slave link for
|
||||||
|
@ -87,6 +87,13 @@ extern unsigned int ata_read_log_page(struct ata_device *dev, u8 log,
|
|||||||
|
|
||||||
#define to_ata_port(d) container_of(d, struct ata_port, tdev)
|
#define to_ata_port(d) container_of(d, struct ata_port, tdev)
|
||||||
|
|
||||||
|
/* libata-sata.c */
|
||||||
|
#ifdef CONFIG_SATA_HOST
|
||||||
|
int sata_set_spd_needed(struct ata_link *link);
|
||||||
|
#else
|
||||||
|
static inline int sata_set_spd_needed(struct ata_link *link) { return 1; }
|
||||||
|
#endif
|
||||||
|
|
||||||
/* libata-acpi.c */
|
/* libata-acpi.c */
|
||||||
#ifdef CONFIG_ATA_ACPI
|
#ifdef CONFIG_ATA_ACPI
|
||||||
extern unsigned int ata_acpi_gtf_filter;
|
extern unsigned int ata_acpi_gtf_filter;
|
||||||
|
@ -1074,7 +1074,6 @@ static inline int ata_port_is_dummy(struct ata_port *ap)
|
|||||||
return ap->ops == &ata_dummy_port_ops;
|
return ap->ops == &ata_dummy_port_ops;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int sata_set_spd(struct ata_link *link);
|
|
||||||
extern int ata_std_prereset(struct ata_link *link, unsigned long deadline);
|
extern int ata_std_prereset(struct ata_link *link, unsigned long deadline);
|
||||||
extern int ata_wait_after_reset(struct ata_link *link, unsigned long deadline,
|
extern int ata_wait_after_reset(struct ata_link *link, unsigned long deadline,
|
||||||
int (*check_ready)(struct ata_link *link));
|
int (*check_ready)(struct ata_link *link));
|
||||||
@ -1194,6 +1193,7 @@ extern int sata_scr_valid(struct ata_link *link);
|
|||||||
extern int sata_scr_read(struct ata_link *link, int reg, u32 *val);
|
extern int sata_scr_read(struct ata_link *link, int reg, u32 *val);
|
||||||
extern int sata_scr_write(struct ata_link *link, int reg, u32 val);
|
extern int sata_scr_write(struct ata_link *link, int reg, u32 val);
|
||||||
extern int sata_scr_write_flush(struct ata_link *link, int reg, u32 val);
|
extern int sata_scr_write_flush(struct ata_link *link, int reg, u32 val);
|
||||||
|
extern int sata_set_spd(struct ata_link *link);
|
||||||
#else
|
#else
|
||||||
static inline int sata_scr_valid(struct ata_link *link) { return 0; }
|
static inline int sata_scr_valid(struct ata_link *link) { return 0; }
|
||||||
static inline int sata_scr_read(struct ata_link *link, int reg, u32 *val)
|
static inline int sata_scr_read(struct ata_link *link, int reg, u32 *val)
|
||||||
@ -1208,6 +1208,7 @@ static inline int sata_scr_write_flush(struct ata_link *link, int reg, u32 val)
|
|||||||
{
|
{
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
static inline int sata_set_spd(struct ata_link *link) { return -EOPNOTSUPP; }
|
||||||
#endif
|
#endif
|
||||||
extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
||||||
bool spm_wakeup);
|
bool spm_wakeup);
|
||||||
|
Loading…
Reference in New Issue
Block a user