From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0CD16525E for ; Mon, 22 Apr 2024 01:54:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713750874; cv=none; b=fvoEmOvHqHP8fHpHUQ9VLEBjLGDarIzCXNTbARkaZDrM01b5xpbX87PqepzAyWaGRkYqJq+yRAnq1wFp3Jkby89H011NC1DgYQCcrnendRCKA9Qe14SpV4nzCXj4xxNyKSt1/H1hg0hXPbCbstz8RxfpKK3ITls8Qhu3Uqv25t8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713750874; c=relaxed/simple; bh=SfhdMqqsGb/GVXHl6IHUVQQdHafTxfe3mLLG/FzGS/w=; h=Message-ID:Subject:From:To:Cc:Date:In-Reply-To:References: MIME-Version:Content-Type; b=BizBiLi6Kw7ZcIZjI+FshkeE5ddZkY51zFROtfv75+rRhe8jNZ5bq5SpvuPh18WqFcTXMNm94+lOAbNypBqv9fxN5LrMrn4X1V0vmOQb134sSrZn6hKHF2uqnfzeABM+IP6LLolfTO2GcAcirtv8tYZAlE4MBT6iaUzPu2Ja/Vo= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=ATJhwCF8; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="ATJhwCF8" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1713750871; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=SfhdMqqsGb/GVXHl6IHUVQQdHafTxfe3mLLG/FzGS/w=; b=ATJhwCF8PT2i8S9vuSAROek3bq+scktUrN2IHI5nu76dKrA8eEwWWLMYpz6HRkTpPNNb8T i+wOHN+r2bwZ6TWQ170qWMjKb+iV9PpQ5oXelSy0lGefbtx3gx1Bgb/Jq2QTfI/CYiqaJN kQRdC/PPAjWTQ3z41AfnplSzd7YAO0E= Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-45-yTdmgo-lNeCD9ek63h--4g-1; Sun, 21 Apr 2024 21:54:28 -0400 X-MC-Unique: yTdmgo-lNeCD9ek63h--4g-1 Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-69b6fe789e9so53592626d6.0 for ; Sun, 21 Apr 2024 18:54:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713750868; x=1714355668; h=mime-version:user-agent:content-transfer-encoding:organization :autocrypt:references:in-reply-to:date:cc:to:from:subject:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=SfhdMqqsGb/GVXHl6IHUVQQdHafTxfe3mLLG/FzGS/w=; b=Fj3Pms+UGod1NKULuXwOJN0YCetcaWGDPcIQeAqBNh+Jj3yJmIJkEnNuBwAC15afBv solODcb0pUgSw+Jik32Kb0dgHAQxjEA1I92tsb/YpD16hsLzR7Pn2mm+33Hb1cn+wDn4 T+4nGAV2E0g/8/Gm/J2Uffmm+PKUorN5RGdODjKHo20gD+VpSbTxfmmU8xFY84ey+l4O EKk3WvLpnrAWb7one920Koe70fazYr3WoA4w1nbvTM6LeiQjzzuJzMGdeJ0D+6F+Xwhy oOf7MdQXri9AnGcGT31P77q2j79gaRFl50HnC1KGEpqrWDHIGZtyHgECt5qtwPku20vR 7Ztw== X-Forwarded-Encrypted: i=1; AJvYcCWFyHpg1Sq+Glg3DypIX4w9RBh8FV4jASSK0E/u+eXWyqEb8WTC4StxA9AyC82TDaUojSrEKa426El1SVpmzpDDXZAVVP4YWvA2qdAl+Ns= X-Gm-Message-State: AOJu0Yy/nVqJ5aJrt+JKZU6FboCSn11gdOSUI5gjJpvk5vWuh3xsP3ji cc6QX4kmjCvJc/cu0ibCRqkO7tpN6uzIVRPCutmYESWblVrtmm/YKu3BfWtu9qDgBKWYUfgwWf7 NwKvdbfZdosJp3MQnuuISWMsYX0r3bkvOzTljI1i8U+8/aHwMHdP6fOGx5sMIAXL6 X-Received: by 2002:a05:6214:812:b0:69c:9d5c:4181 with SMTP id df18-20020a056214081200b0069c9d5c4181mr8634536qvb.32.1713750868086; Sun, 21 Apr 2024 18:54:28 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH6JLAg3JjLcRgAI5pETD9qvk949nYd1H9AD604B3cVyG1mc0bmHKKfvRQ6uMsbg5ImmOdb6w== X-Received: by 2002:a05:6214:812:b0:69c:9d5c:4181 with SMTP id df18-20020a056214081200b0069c9d5c4181mr8634527qvb.32.1713750867810; Sun, 21 Apr 2024 18:54:27 -0700 (PDT) Received: from ?IPv6:2600:4040:5c6c:a300::789? ([2600:4040:5c6c:a300::789]) by smtp.gmail.com with ESMTPSA id x18-20020a0ca892000000b0069b16a0f26esm397246qva.58.2024.04.21.18.54.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 21 Apr 2024 18:54:26 -0700 (PDT) Message-ID: <6a16f0023b62beba4658677bebcc4786da1ea4be.camel@redhat.com> Subject: Re: [PATCH 2/4] WIP: drm: Introduce rvkms From: Lyude Paul To: Benno Lossin , dri-devel@lists.freedesktop.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho , Boqun Feng , Gary Guo , =?ISO-8859-1?Q?Bj=F6rn?= Roy Baron , Andreas Hindborg , Alice Ryhl , linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org Date: Sun, 21 Apr 2024 21:54:25 -0400 In-Reply-To: References: <20240322221305.1403600-1-lyude@redhat.com> <20240322221305.1403600-3-lyude@redhat.com> Autocrypt: addr=lyude@redhat.com; prefer-encrypt=mutual; keydata=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 Organization: Red Hat Inc. User-Agent: Evolution 3.50.4 (3.50.4-1.fc39) Precedence: bulk X-Mailing-List: rust-for-linux@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, 2024-03-27 at 21:06 +0000, Benno Lossin wrote: > On 22.03.24 23:03, Lyude Paul wrote: > > diff --git a/drivers/gpu/drm/rvkms/connector.rs > > b/drivers/gpu/drm/rvkms/connector.rs > > new file mode 100644 > > index 0000000000000..40f84d38437ee > > --- /dev/null > > +++ b/drivers/gpu/drm/rvkms/connector.rs > > @@ -0,0 +1,55 @@ > > +// TODO: License and stuff > > +// Contain's rvkms's drm_connector implementation > > + > > +use super::{RvkmsDriver, RvkmsDevice, MAX_RES, DEFAULT_RES}; > > +use kernel::{ > > +=C2=A0=C2=A0=C2=A0 prelude::*, > > +=C2=A0=C2=A0=C2=A0 drm::{ > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 device::Device, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 kms::{ > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 con= nector::{self, ConnectorGuard}, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Mod= eConfigGuard > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } > > +=C2=A0=C2=A0=C2=A0 }, > > +=C2=A0=C2=A0=C2=A0 prelude::* > > +}; > > +use core::marker::PhantomPinned; > > + > > +#[pin_data] > > +pub(crate) struct DriverConnector { > > +=C2=A0=C2=A0=C2=A0 #[pin] > > +=C2=A0=C2=A0=C2=A0 _p: PhantomPinned > > +} >=20 > This struct does not need to be annotated with `#[pin_data]`, this > should just work: >=20 > pub(crate) struct DriverConnector; >=20 > > + > > +pub(crate) type Connector =3D connector::Connector; > > + > > +impl connector::DriverConnector for DriverConnector { > > +=C2=A0=C2=A0=C2=A0 type Initializer =3D impl PinInit; > > + > > +=C2=A0=C2=A0=C2=A0 type State =3D ConnectorState; > > + > > +=C2=A0=C2=A0=C2=A0 type Driver =3D RvkmsDriver; > > + > > +=C2=A0=C2=A0=C2=A0 type Args =3D (); > > + > > +=C2=A0=C2=A0=C2=A0 fn new(dev: &Device, args: Self::Args= ) -> > > Self::Initializer { >=20 > And then here just return `Self`. >=20 > This works, since there is a blanket impl `PinInit for T`. >=20 > Looking at how you use this API, I am not sure if you actually need > pin-init for the type that implements `DriverConnector`. > Do you need to store eg `Mutex` or something else that needs > pin-init in here in a more complex driver? Most likely yes - a lot of drivers have various private locks contained within their subclassed mode objects. I'm not sure we will in rvkms's connector since vkms doesn't really do much with connectors - but we at a minimum be using pinned types (spinlocks and hrtimers) in our DriverCrtc implementation once I've started implementing support for vblanks[1] [1] https://www.kernel.org/doc/html/v6.9-rc5/gpu/drm-kms.html?highlight=3Dvblan= k#vertical-blanking In nova (the main reason I'm working on rvkms in the first place), we'll definitely have locks in our connectors and possibly other types. >=20 --=20 Cheers, Lyude Paul (she/her) Software Engineer at Red Hat