The expl3 language provides a function tl_upper_case:nn {language} {input}, where the language code de-alt converts ß to a großes Eszett.
\documentclass{minimal}
\usepackage{libertinus}
\ExplSyntaxOn
\newcommand\toUpper[1]{\tl_upper_case:nn{de-alt}{#1}}
\ExplSyntaxOff
\begin{document}
\toUpper{Frauenfußball}
\end{document}

In newer systems, you could instead use \text_uppercase:nn. As of 2020, the documentation says that the second argument should be “a BCP 47 string,” but in fact only de-alt works, and de-DE-1996 as specified in the RFC does not. With the newer interfaces, you would therefore write:
\text_uppercase:nn {de-alt}{\text_expand:n{#1}}
The expl3 documentation claims that you can define your own mapping with \char_set_uccode:nn, but when I tested this with
\char_set_uccode:nn {`ß} {`ẞ}
within the same TeX group as a \tl_upper_case:n or text_uppercase:n, it still mapped ß to SS.