Re: [RFC] 2.6.0 EDD enhancements

Matt Domsch
2003-12-19T19:03:17Z

You can import this changeset into BK by piping this whole message to
'| bk receive [path to repository]' or apply the patch as usual.

===================================================================

ChangeSet@1.1532.1.3, 2003-12-18 17:43:51-06:00, Matt_Domsch@dell.com
EDD: add sysfs symlinks for IDE devices

Devices reporting as type "ATA" to the EDD 3.0 BIOS calls
now get symlinks pointing from the int13_dev8x device
to the IDE disk device in sysfs.

EDD 3.0 maps all IDE devices on a single PCI device with a single
device value; there's no concept of multiple channels,
primary/secondary devices on a channel. This may not be equivalent,
but edd.c currently matches only based on ide_drive_t.lun ==
EDD device value. This should perhaps be taken up with
the T13 committee, as their spec seems incomplete in this regard.

edd.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 87 insertions, 1 deletion

diff -Nru a/arch/i386/kernel/edd.c b/arch/i386/kernel/edd.c
--- a/arch/i386/kernel/edd.c Fri Dec 19 12:53:46 2003
+++ b/arch/i386/kernel/edd.c Fri Dec 19 12:53:46 2003
@@ -55,12 +55,13 @@
/* FIXME - this really belongs in include/scsi/scsi.h */
#include <../drivers/scsi/scsi.h>
#include <../drivers/scsi/hosts.h>
+#include <linux/ide.h>

MODULE_AUTHOR("Matt Domsch <Matt_Domsch@Dell.com>");
MODULE_DESCRIPTION("sysfs interface to BIOS EDD information");
MODULE_LICENSE("GPL");

-#define EDD_VERSION "0.12 2003-Dec-18"
+#define EDD_VERSION "0.13 2003-Dec-18"
#define EDD_DEVICE_NAME_SIZE 16
#define REPORT_URL "http://domsch.com/linux/edd30/results.html"

@@ -647,6 +648,90 @@
}
#endif

+#if defined(CONFIG_IDE) || defined(CONFIG_IDE_MODULE)
+
+struct edd_ide_match_data {
+ struct edd_device * edev;
+ ide_drive_t * ide_drive;
+};
+
+/**
+ * edd_match_idedev()
+ * @edev - EDD device is a known IDE device
+ * @sd - ide_device with host who's parent is a PCI controller
+ *
+ * returns 1 if a match is found, 0 if not.
+ */
+static int edd_match_idedev(struct device * dev, void * d)
+{
+ struct edd_ide_match_data * data = (struct edd_ide_match_data *)d;
+ struct edd_info *info = edd_dev_get_info(data->edev);
+ ide_drive_t * drive = container_of(dev,ide_drive_t,gendev);
+
+ if (info && drive) {
+ if (drive->lun == info->params.device_path.ata.device) {
+ data->ide_drive = drive;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/**
+ * edd_find_matching_ide_device()
+ * @edev - edd_device to match
+ *
+ * Search the IDE devices for a drive that matches the EDD
+ * device descriptor we have. If we find a match, return it,
+ * otherwise, return NULL.
+ */
+
+static ide_drive_t *
+edd_find_matching_ide_device(struct edd_device *edev)
+{
+ struct edd_ide_match_data data;
+ struct bus_type * ide_bus = find_bus("ide");
+
+ if (!ide_bus) {
+ return NULL;
+ }
+
+ data.edev = edev;
+
+ if (edd_dev_is_type(edev, "ATA")) {
+ if (bus_for_each_dev(ide_bus,NULL,&data,edd_match_idedev))
+ return data.ide_drive;
+ }
+ return NULL;
+}
+
+static int
+edd_create_symlink_to_idedev(struct edd_device *edev)
+{
+ struct pci_dev *pci_dev;
+ int rc = -EINVAL;
+
+ pci_dev = edd_get_pci_dev(edev);
+ if (pci_dev) {
+ ide_drive_t * ide_drive = edd_find_matching_ide_device(edev);
+ if (ide_drive && get_device(&ide_drive->gendev)) {
+ rc = sysfs_create_link(&edev->kobj,
+ &ide_drive->gendev.kobj,
+ "disc");
+ put_device(&ide_drive->gendev);
+ }
+ }
+ return rc;
+}
+
+#else
+static int
+edd_create_symlink_to_idedev(struct edd_device *edev)
+{
+ return -ENOSYS;
+}
+#endif
+

static inline void
edd_device_unregister(struct edd_device *edev)
@@ -669,6 +754,7 @@
if (!error) {
edd_create_symlink_to_pcidev(edev);
edd_create_symlink_to_scsidev(edev);
+ edd_create_symlink_to_idedev(edev);
}
}

===================================================================

This BitKeeper patch contains the following changesets:
1.1532.1.3
## Wrapped with gzip_uu ##

M'XL( #I)XS\ \57;4_C1A#^'/^*:9!HDL:.-\X[#8(C]!H=!PB.DRJ=9"WV
M!KMQ['1W#8>:^^^=76\2!VBDJTXJ1,&[._/,[#-OY@#N!..CRD<JI3_)%B*(
MK /X/1-R5 E9DCA!ML"-FRS#C5:4+5AK$6JQUOV\Q<*PE<1I_M5N.UT;5Q;*
M7E,91/#(N!A5B.-M=N3SDHTJ-^?O[RY.;RQK/(:SB*8/[)9)&(\MF?%'FH3B
MA,HHR5)'<IJ*!9-4N;#:B*[:KMO&WR[I>VZWMR(]M]-?!20DA'8("]UV9]#K
M6*7[G*SOL0OBD389M-M>E_16W?ZP1ZP)$(=TO;:#7H/KM4B[109 ^J..-^H2
MV^V-7!?> H9?"-BN]0Y^[!W.K #.)Y,1T# $\2QF K\7R/=<P"SC,)V<0\@>
MXX )E,3/I%@ 9\N,RSA] "HT[5 ]_71:1?= 1DQA@N>X\&YZ=0L!31*EGF9/
M\("1V%A89G&J,68<;ZCT<$T\'RT.OAJ[J&<PM2^QF)L#E"T\=@K/UB87="D
M+99]ARP%"@)-)0RNSZ9KB*=81IL#Q##;2'#.CI11SGX6Z#<$61JPI81L!HL\
MD?$2<0+D.F6):*+BDL<+RI];@J%DB$^[EHVH _ IB@6Z^(R@$NX9L+_R&,VQ
M5"J8^UP"IK@30)!SCIO),PIC9FL@7-Q3P4*%&8?,#WG\R'SI)'FJLKN@H'R%
MM3T197D2PI+Q2)&#9B6=LQ3RI69 48S\?B(>WG.QB*5DK*GC&K&8@UBR 1C
M"X&4HP#>76KVI<+F[('RT+$^0)'AU]N2L^SO_+$LE[K6\9L%L*(<&T+L#7JM
M.>-(9DL3I?.<N.ZP[1*OVUF1;KO?60U[O6%_-NO?T]";]6GPO8A%X7H=K^.N
MR)!TAKJ7O"VOJ/_A#G\OXJ;3N%W5:=JN[C1M\K+'=-R]/6;0!YO\KTWF Q1\
M7X'-G_0'T^+Z7ZC_#PDV[?:!6 >8R$D>,OA5CY865I,3'5N3GH>'4_U]$+)9
MG.I.YG\^O[F=7EU"U76P1A3=]H0%-AE44;@SA$$'$6=0:(2ULZO+WZ;O?;Q6
M'5:K-[;]CU>3NXOSNO7%$I+G@2YZ7Y6T+G8_I)+"WU:E=%CP4VG@@CT>6952
M_5? _#2V7>'(^G:$Z*U&PX*&!BB040#U:W6U>Z(>P2YW#:QG"G/LTVDI*%I6
MA"BIX4N=,\(9#D]1ACUR256[*@!4@\4V*'F6)(RCND+@3.8\%4 F:)%5U/B
MLRQ/PR:X:AM[HH.R+62%RCA0T^"U[X84XT=#/33A,8M#]5RW=FE[P2E*J#]C
MJ.V1J8='NQCI+(.&_AZO8^'C'-,'-:5C'RO/ZKMA4<;4$RHI,BCF />S64WY
M6Q)K/K"T4/Z"ZC.H:4.'AX5R7:6!WM9+^[CH]:"$[&,DG2Z$4U#A+[%8'?3&
MK O52N'?QB!Z8Q($SXJ8 %&+;Y;ZF!T7\V<W?3"%31QP5OK;1-A-I6VFJJ&M
MQ4WX;YDJX>T<-]-1E3\U/,F(RLVT,R\15A%@!1@R$?!XB:T)GAA$]!''VW2F
MGI5OZY1JFD2#& <J*F=JB#_%@FT.+N\N+HHL^[+)LW+4K+W7?562T-"QWY]W
MZFN;5/>Y\/4K4U&PN,2H:(OX6*OB7G6;#C\9D2*<I3L<J8"AD,)V-/]CTQR,
MYCI5X\):C>E*T:]I]6U>*6<P"CZCREFL+V.OJ6PT#Q5Z\V4-UNNE[-'V2XVG
ME$:%F]]*1*=2TQMP1B7SS13P9?:BN/?1NPQB=08-\Z"J#OL$QT$,]OGT\O/I
MA:9@+5?4K*I7LU/;%"M>W^P9/G:JMUPS>W-BC5>4[T8+:UA9-4*'FP/[V)2\
MJ5#MN1Z+:UX4*;5#!6L?S[/[/YM*K++N\Z^1G-="57Q3#JK:J\HRW^?%J^+G
M01&S WRW93\D<@;8/K^\NOWC5J$?H.UXAD:FO3[!:5NI[ 4W#&_^S\,6$<Q%
3OA@S;]CO]?M#ZQ\^.P-/90X